Fix problems with state propagation
authorMatthias Clasen <mclasen@redhat.com>
Mon, 7 Feb 2011 16:23:43 +0000 (11:23 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 7 Feb 2011 16:27:50 +0000 (11:27 -0500)
Sensitivity changes were not properly propagated down the
hierarchy. There were two issues here:

a) correctly identifying when a state change request affects
   sensitivity
b) not filtering out sensitivity in gtk_widget_propagate_state(),
  since gtk_widget_set_sensitivity() uses that to do its work

https://bugzilla.gnome.org/show_bug.cgi?id=641431

gtk/gtkwidget.c

index 410f493fcae56fdc4fb5bdbebdb6ec0c5863e61f..b2f14db7a6f9e122f8c02ef85fe628fac0cb086a 100644 (file)
@@ -6959,10 +6959,12 @@ _gtk_widget_update_state_flags (GtkWidget     *widget,
   /* Handle insensitive first, since it is propagated
    * differently throughout the widget hierarchy.
    */
-  if ((flags & GTK_STATE_FLAG_INSENSITIVE) !=
-      (priv->state_flags & GTK_STATE_FLAG_INSENSITIVE))
-    gtk_widget_set_sensitive (widget,
-                              operation != STATE_CHANGE_UNSET);
+  if ((priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags & GTK_STATE_FLAG_INSENSITIVE) && (operation == STATE_CHANGE_UNSET))
+    gtk_widget_set_sensitive (widget, TRUE);
+  else if (!(priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && (flags & GTK_STATE_FLAG_INSENSITIVE) && (operation != STATE_CHANGE_UNSET))
+    gtk_widget_set_sensitive (widget, FALSE);
+  else if ((priv->state_flags & GTK_STATE_FLAG_INSENSITIVE) && !(flags & GTK_STATE_FLAG_INSENSITIVE) && (operation == STATE_CHANGE_REPLACE))
+    gtk_widget_set_sensitive (widget, TRUE);
 
   if (operation != STATE_CHANGE_REPLACE)
     flags &= ~(GTK_STATE_FLAG_INSENSITIVE);
@@ -11245,8 +11247,8 @@ gtk_widget_propagate_state (GtkWidget    *widget,
         {
           data->parent_sensitive = gtk_widget_is_sensitive (widget);
 
-          /* Do not propagate insensitive state further */
-          data->flags &= ~(GTK_STATE_FLAG_INSENSITIVE | GTK_STATE_FLAG_FOCUSED);
+          /* Do not propagate focused state further */
+          data->flags &= ~GTK_STATE_FLAG_FOCUSED;
 
           if (data->use_forall)
             gtk_container_forall (GTK_CONTAINER (widget),